Spring JDBC এ Caching

Java Technologies - স্প্রিং জেডিবিসি (Spring JDBC)
94
94

Spring JDBC-তে ক্যাশিং ব্যবহার করলে ডেটাবেস অপারেশনের পারফরম্যান্স বৃদ্ধি পায়। ক্যাশিং মূলত ডেটাবেসের বারবার একই ডেটা রিকোয়েস্ট করার সময় অ্যাপ্লিকেশন লেয়ারে সেই ডেটা সঞ্চয় করে রাখে, ফলে ডেটাবেসে বারবার রিকোয়েস্ট না করেও দ্রুত ফলাফল পাওয়া যায়।


Spring JDBC-তে ক্যাশিং কেন প্রয়োজন?

  1. বারবার একই ডেটার জন্য ডেটাবেস রিকোয়েস্ট কমানো।
  2. ডেটাবেস লোড কমিয়ে পারফরম্যান্স বৃদ্ধি।
  3. নেটওয়ার্ক ও ডেটাবেস কানেকশন কম ব্যবহার।

Spring JDBC-তে ক্যাশিং বাস্তবায়নের ধাপগুলো:

1. Spring Framework এর সাথে Caching সক্ষম করা

Spring Framework সরাসরি ক্যাশিং সমর্থন করে। এটি চালু করতে আপনাকে নিচের ধাপগুলো অনুসরণ করতে হবে:

Dependency যোগ করা

Maven বা Gradle এর মাধ্যমে Spring Cache যোগ করুন।

Maven Dependency:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.21</version>
</dependency>
Caching সক্ষম করার জন্য Annotation ব্যবহার

@EnableCaching অ্যানোটেশন ব্যবহার করে Spring-এর ক্যাশিং মেকানিজম চালু করুন।

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {
    // Cache configuration
}

2. @Cacheable অ্যানোটেশন ব্যবহার করা

Spring-এর ক্যাশিং মেকানিজম ব্যবহার করতে @Cacheable অ্যানোটেশন ব্যবহার করা হয়। এটি একটি মেথডের আউটপুট ক্যাশ করে রাখে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class EmployeeService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Cacheable("employees")
    public List<Employee> getAllEmployees() {
        String query = "SELECT * FROM employees";
        return jdbcTemplate.query(query, (rs, rowNum) -> {
            Employee employee = new Employee();
            employee.setId(rs.getInt("id"));
            employee.setName(rs.getString("name"));
            employee.setDepartment(rs.getString("department"));
            return employee;
        });
    }
}
ব্যাখ্যা:
  • প্রথমবার getAllEmployees() মেথড কল করার সময় ডেটা ডেটাবেস থেকে ফেচ করা হবে এবং ক্যাশে সংরক্ষণ করা হবে।
  • দ্বিতীয়বার থেকে একই ডেটার জন্য ক্যাশ থেকে রেসপন্স দেওয়া হবে।

3. Spring Cache Configuration

Spring Framework-এ ক্যাশিংয়ের জন্য বিভিন্ন প্রভাইডার ব্যবহার করা যায়, যেমন EhCache, Caffeine, বা Hazelcast। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে ConcurrentMapCache ব্যবহার করা হয়েছে।

import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("employees");
    }
}

4. ক্যাশ ইনভ্যালিডেশন এবং আপডেট

ক্যাশ ইনভ্যালিড বা রিফ্রেশ করার জন্য @CacheEvict এবং @CachePut ব্যবহার করা হয়।

ক্যাশ মুছে ফেলার জন্য @CacheEvict:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @CacheEvict(value = "employees", allEntries = true)
    public void clearEmployeeCache() {
        System.out.println("Employee cache cleared");
    }
}

ক্যাশ আপডেট করার জন্য @CachePut:

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @CachePut(value = "employees", key = "#employee.id")
    public Employee updateEmployee(Employee employee) {
        // Update logic in database
        return employee;
    }
}

5. Spring Boot-এ ক্যাশিং ইন্টিগ্রেশন

Spring Boot ব্যবহার করলে ক্যাশিং আরও সহজ হয়।

Application.properties Configuration:

spring.cache.type=simple

Spring Boot ক্যাশ অটোমেশন উদাহরণ:

Spring Boot অ্যাপ্লিকেশনে ক্যাশ ব্যবহারের জন্য উপরের @EnableCaching, @Cacheable, এবং @CacheEvict মেথডগুলো ঠিক একইভাবে কাজ করে।


ক্যাশিংয়ের সুবিধা ও সীমাবদ্ধতা:

সুবিধা:

  1. ডেটাবেসের লোড কমানো।
  2. দ্রুত ফলাফল পাওয়া।
  3. নেটওয়ার্ক ল্যাটেন্সি কমানো।
  4. সহজে ইনটিগ্রেট করা যায়।

সীমাবদ্ধতা:

  1. ডেটা যদি পরিবর্তিত হয় তবে ক্যাশ ইনভ্যালিডেশন সঠিকভাবে করতে হবে।
  2. খুব বড় ডেটা ক্যাশ করলে মেমরি ব্যবহার বেড়ে যেতে পারে।
  3. সঠিক ক্যাশিং প্রভাইডার নির্বাচন করা না হলে পারফরম্যান্স কমে যেতে পারে।

উপসংহার:

Spring JDBC-তে ক্যাশিং একটি শক্তিশালী ফিচার, যা অ্যাপ্লিকেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়িয়ে তোলে। Spring-এর বিল্ট-ইন ক্যাশিং মেকানিজমের পাশাপাশি বিভিন্ন ক্যাশিং প্রভাইডার ব্যবহার করে এটি আরও কাস্টমাইজ করা যায়। তবে ক্যাশ ব্যবস্থাপনার সঠিক নকশা এবং ইনভ্যালিডেশন স্ট্র্যাটেজি গুরুত্বপূর্ণ।

Content added By

Caching এর ধারণা এবং Spring JDBC তে এর প্রয়োজনীয়তা

72
72

Caching হলো একটি মেকানিজম যা ডেটা বা ফলাফলকে একটি দ্রুত এক্সেসযোগ্য স্টোরেজে সংরক্ষণ করে, যাতে একই ডেটার জন্য পরবর্তী অনুরোধগুলোতে ডাটাবেস বা কম্প্লেক্স প্রসেসিংয়ে যাওয়ার প্রয়োজন হয় না। এটি অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়।

ক্যাশিং-এর মূল উদ্দেশ্য:

  1. দ্রুত ডেটা অ্যাক্সেস: একই ডেটা বারবার ডাটাবেস থেকে আনতে সময় লাগে। ক্যাশিং ডেটা দ্রুত সরবরাহ করে।
  2. লোড হ্রাস করা: ডাটাবেস বা সার্ভারে লোড কমায়।
  3. পারফরম্যান্স উন্নত করা: কম সময়ে ডেটা অ্যাক্সেস করে অ্যাপ্লিকেশনের গতি বৃদ্ধি করে।

ক্যাশিং কোথায় ব্যবহৃত হয়?

  • ডাটাবেস থেকে বারবার একই ডেটা পড়তে হলে।
  • কম্প্লেক্স গণনা বা প্রসেসিং এর ফলাফল সংরক্ষণ করতে।
  • API কল বা থার্ড-পার্টি সার্ভিস থেকে ডেটা রিট্রিভ করার সময়।

Spring JDBC-তে Caching এর প্রয়োজনীয়তা

স্প্রিং জেডিবিসি ব্যবহার করে অ্যাপ্লিকেশন যখন ডাটাবেসের সাথে কাজ করে, তখন ক্যাশিং এর ব্যবহার বেশ কয়েকটি সুবিধা প্রদান করে:

  1. বারবার ডাটাবেস কল কমানো:
    • একই ডেটা বারবার রিকোয়েস্ট করলে ক্যাশিং ডাটাবেসের লোড কমায়।
  2. রিড অপারেশনের পারফরম্যান্স বৃদ্ধি:
    • ফ্রিকোয়েন্টলি রিড হওয়া ডেটা ক্যাশে রেখে দ্রুত অ্যাক্সেস করা যায়।
  3. ব্যাচ প্রসেসিং ত্বরান্বিত করা:
    • ব্যাচ প্রসেসিংয়ের সময় রেফারেন্স ডেটা ক্যাশে রাখলে অপারেশনগুলো দ্রুত হয়।
  4. ডেটাবেস সার্ভার ব্যয় হ্রাস:
    • ক্যাশিং ব্যবহার করে ডাটাবেসের উপর চাপ কমানো যায়, যা সার্ভার ব্যয় হ্রাস করে।

Spring JDBC এবং Caching এর বাস্তবায়ন

Spring JDBC তে ক্যাশিং সরাসরি সমর্থন করে না। তবে, স্প্রিং-এর ক্যাশিং মডিউল এবং বিভিন্ন ক্যাশিং লাইব্রেরি (যেমন EhCache, Caffeine, Redis) ব্যবহার করে ক্যাশিং ইমপ্লিমেন্ট করা যায়।


উদাহরণ সহ Spring JDBC-তে ক্যাশিং বাস্তবায়ন

১. Spring Caching ব্যবহার করে ক্যাশিং ইমপ্লিমেন্ট করা

Dependency যোগ করা (Maven):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.3</version>
</dependency>
Configuration Class:
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new CaffeineCacheManager("studentsCache");
    }
}
Service Layer:
@Service
public class StudentService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Cacheable("studentsCache")
    public Student getStudentById(int id) {
        System.out.println("Fetching from database...");
        String sql = "SELECT id, name, age FROM students WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
            Student student = new Student();
            student.setId(rs.getInt("id"));
            student.setName(rs.getString("name"));
            student.setAge(rs.getInt("age"));
            return student;
        });
    }
}
Controller বা Main Method:
public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    StudentService studentService = context.getBean(StudentService.class);

    // প্রথমবার ডাটাবেস থেকে ডেটা রিট্রিভ হবে
    Student student1 = studentService.getStudentById(1);
    System.out.println(student1);

    // একই রেকর্ড দ্বিতীয়বার রিকোয়েস্ট করলে ক্যাশ থেকে ডেটা রিট্রিভ হবে
    Student student2 = studentService.getStudentById(1);
    System.out.println(student2);
}

আউটপুট:

Fetching from database...
Student{id=1, name='John Doe', age=20}
Student{id=1, name='John Doe', age=20}

২. Redis ব্যবহার করে ক্যাশিং ইমপ্লিমেন্ট করা

Dependency যোগ করা (Maven):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Configuration Class:
@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        return RedisCacheManager.builder(connectionFactory).build();
    }
}
Service Layer:
@Service
public class StudentService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Cacheable("studentsCache")
    public Student getStudentById(int id) {
        System.out.println("Fetching from database...");
        String sql = "SELECT id, name, age FROM students WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
            Student student = new Student();
            student.setId(rs.getInt("id"));
            student.setName(rs.getString("name"));
            student.setAge(rs.getInt("age"));
            return student;
        });
    }
}

Spring Caching Key Annotations

  1. @Cacheable:

    • ক্যাশ থেকে ডেটা রিটার্ন করে, যদি ক্যাশে পাওয়া যায়। অন্যথায় ডাটাবেস থেকে ডেটা নিয়ে ক্যাশে সংরক্ষণ করে।

    উদাহরণ:

    @Cacheable("cacheName")
    public Data fetchData(int id) { ... }
    
  2. @CachePut:

    • ডেটা ক্যাশে আপডেট করে।

    উদাহরণ:

    @CachePut("cacheName")
    public Data updateData(int id, Data newData) { ... }
    
  3. @CacheEvict:

    • ক্যাশ থেকে ডেটা মুছে ফেলে।

    উদাহরণ:

    @CacheEvict("cacheName")
    public void deleteData(int id) { ... }
    

Spring JDBC তে Caching এর সুবিধা

  1. ডাটাবেস লোড হ্রাস: ক্যাশ থেকে ডেটা পড়ার কারণে ডাটাবেসের উপর চাপ কমে।
  2. দ্রুত রেসপন্স: ক্যাশ থেকে ডেটা এক্সেস দ্রুত হয়।
  3. ব্যবস্থাপনা সহজ: Spring এর বিল্ট-ইন অ্যানোটেশন এবং টুল দিয়ে ক্যাশ সহজে ব্যবস্থাপনা করা যায়।
  4. স্কেলেবিলিটি: Redis বা EhCache ব্যবহার করে ক্যাশিং স্কেলেবল করা যায়।

উপসংহার

Spring JDBC-তে ক্যাশিং ব্যবহার করা অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি বৃদ্ধির একটি কার্যকর পদ্ধতি। Spring এর বিল্ট-ইন ক্যাশিং মেকানিজম, যেমন @Cacheable, সহজভাবে ক্যাশিং ইমপ্লিমেন্ট করতে সহায়ক। Redis এবং EhCache এর মতো টুল ব্যবহার করে ক্যাশিং আরও শক্তিশালী করা যায়।

Content added By

EhCache, Redis এর সাথে Integration

94
94

স্প্রিং জেডিবিসি (Spring JDBC) তে EhCache এবং Redis এর সাথে ইন্টিগ্রেশন একটি কার্যকরী পদ্ধতি হতে পারে, যেহেতু ক্যাশিং ডেটাবেস অ্যাক্সেসের সংখ্যা কমায়, কর্মক্ষমতা বৃদ্ধি করে এবং দ্রুত অ্যাক্সেস নিশ্চিত করে। ক্যাশিং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশন আরও দ্রুত এবং স্কেলেবল হয়, কারণ ক্যাশে হওয়া ডেটা পুনরায় ডেটাবেস থেকে না এনে সরাসরি ক্যাশ থেকে রিট্রিভ করা যায়।

1. EhCache Integration with Spring JDBC

EhCache হল একটি জনপ্রিয়, ওপেন সোর্স ক্যাশিং লাইব্রেরি যা ডেটা মেমোরি-ভিত্তিক স্টোরেজে সংরক্ষণ করে, যা অ্যাপ্লিকেশনের কর্মক্ষমতা বৃদ্ধি করতে সহায়তা করে।

1.1. EhCache সেটআপ

  • pom.xml এ EhCache এবং Spring Cache-এর ডিপেনডেন্সি যুক্ত করুন:
<dependencies>
    <!-- Spring Cache Dependency -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.3.20</version>
    </dependency>

    <!-- EhCache Dependency -->
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>3.9.1</version>
    </dependency>
</dependencies>

1.2. EhCache কনফিগারেশন

এখন EhCache কনফিগার করার জন্য স্প্রিং কনফিগারেশন ফাইল ব্যবহার করতে হবে। এখানে একটি উদাহরণ দেওয়া হলো।

EhCache কনফিগারেশন (XML Config)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/cache
           http://www.springframework.org/schema/cache/spring-cache-3.0.xsd">

    <!-- Enable caching in Spring -->
    <cache:annotation-driven />

    <!-- EhCache Configuration -->
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <constructor-arg ref="ehCache" />
    </bean>

    <bean id="ehCache" class="org.ehcache.core.EhcacheManager">
        <constructor-arg value="classpath:ehcache.xml" />
    </bean>

</beans>

EhCache কনফিগারেশন (ehcache.xml)

<ehcache xmlns="http://www.ehcache.org/v3">
    <cache alias="employeeCache">
        <key-type>java.lang.Integer</key-type>
        <value-type>com.example.Employee</value-type>
        <resources>
            <heap unit="entries" value="1000" />
            <offheap unit="MB" value="10" />
        </resources>
    </cache>
</ehcache>

1.3. ডেটাবেস ক্যাশিং

এখন, আপনি @Cacheable অ্যানোটেশন ব্যবহার করে স্প্রিং জেডিবিসি মেথডে ক্যাশিং প্রয়োগ করতে পারেন।

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Cacheable(value = "employeeCache", key = "#id")
    public Employee getEmployeeById(int id) {
        // Database query for fetching employee by id
        String sql = "SELECT * FROM Employee WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
    }
}

ব্যাখ্যা:

  • @Cacheable অ্যানোটেশনটি EmployeeDao ক্লাসে ব্যবহৃত হয়েছে যাতে যখন ডেটাবেসে কোনো কর্মচারীর তথ্য অনুসন্ধান করা হয়, তখন প্রথমবার এটি ডেটাবেস থেকে আসবে এবং পরবর্তীতে ক্যাশ থেকে তা রিটার্ন করা হবে।

2. Redis Integration with Spring JDBC

Redis একটি ইন-মেমরি ডেটাবেস, যা মূলত ডেটা স্টোরেজ, ক্যাশিং, এবং মেসেজ ব্রোকার হিসেবে ব্যবহৃত হয়। Redis স্প্রিং অ্যাপ্লিকেশনে একটি জনপ্রিয় ক্যাশিং সমাধান হিসেবে ব্যবহৃত হয়।

2.1. Redis সেটআপ

  • pom.xml এ Redis এবং Spring Data Redis-এর ডিপেনডেন্সি যুক্ত করুন:
<dependencies>
    <!-- Spring Data Redis Dependency -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>2.5.6</version>
    </dependency>

    <!-- Lettuce Redis Client Dependency -->
    <dependency>
        <groupId>io.lettuce.core</groupId>
        <artifactId>lettuce-core</artifactId>
        <version>6.0.1</version>
    </dependency>
</dependencies>

2.2. Redis কনফিগারেশন

স্প্রিং অ্যাপ্লিকেশন কনফিগারেশনে Redis সেটআপ করতে হবে।

RedisConfig.java:

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.cache.redis.RedisCache;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.connection.RedisConnectionFactory;

@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new StringRedisTemplate(connectionFactory);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory);
        return cacheManager;
    }
}

2.3. Redis ক্যাশিং উদাহরণ

এখন, আপনি @Cacheable অ্যানোটেশনটি Redis ক্যাশিং ব্যবহারের জন্য ব্যবহার করতে পারেন।

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Cacheable(value = "employeeCache", key = "#id")
    public Employee getEmployeeById(int id) {
        // Database query for fetching employee by id
        String sql = "SELECT * FROM Employee WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
    }
}

ব্যাখ্যা:

  • এই উদাহরণে @Cacheable অ্যানোটেশনটি ব্যবহার করা হয়েছে, যা Redis ক্যাশে employeeCache নামক ক্যাশে ডেটা সংরক্ষণ করবে। এটি ক্যাশে থেকে ডেটা ফিরিয়ে দেয় এবং যদি ডেটা ক্যাশে না থাকে তবে ডেটাবেস থেকে নিয়ে আসে।

উপসংহার:

  • EhCache এবং Redis স্প্রিং জেডিবিসি তে ক্যাশিং সমাধান হিসেবে অত্যন্ত কার্যকরী।
  • EhCache সাধারণত লোকে মেমরি-ভিত্তিক ক্যাশিংয়ের জন্য ব্যবহার করে, যেখানে ক্যাশড ডেটার পরিমাণ কম থাকে।
  • Redis একটি শক্তিশালী, দ্রুত এবং স্কেলেবল ইন-মেমরি ডেটাবেস এবং ক্যাশিং সিস্টেম হিসেবে ব্যবহৃত হয়, যেখানে বেশি পরিমাণ ডেটা ক্যাশ করা যায়।

উপরোক্ত উদাহরণ এবং কনফিগারেশন অনুসরণ করে আপনি স্প্রিং জেডিবিসি অ্যাপ্লিকেশনে EhCache বা Redis সঠিকভাবে ইন্টিগ্রেট করতে পারবেন, যা আপনার অ্যাপ্লিকেশনকে দ্রুত এবং স্কেলেবল করবে।

Content added By

JdbcTemplate দিয়ে Query Caching বাস্তবায়ন

86
86

Query Caching হল একটি প্রক্রিয়া যেখানে একটি SQL কুয়েরির ফলাফল ক্যাশে সংরক্ষিত থাকে, যাতে পরবর্তী কুয়েরি এক্সিকিউট করার সময় তা পুনরায় ডেটাবেস থেকে না নিয়ে ক্যাশ থেকে সরাসরি ফলাফল নেয়া যায়। Spring JDBC-এ JdbcTemplate ব্যবহার করে Query Caching বাস্তবায়ন করা যায়, তবে এটি সাধারণত Spring-এর অন্যান্য কaching প্রযুক্তি বা ক্যাশ ম্যানেজমেন্ট সিস্টেমের সাথে সমন্বয়ে করা হয়, যেমন Spring Cache, Ehcache, বা Redis

Spring JDBC JdbcTemplate সরাসরি কুয়েরি ক্যাশিং সাপোর্ট করে না, তবে আপনি JdbcTemplate এর সঙ্গে ক্যাশিং ফ্রেমওয়ার্ক সংযুক্ত করে ক্যাশিং বাস্তবায়ন করতে পারেন।

Query Caching বাস্তবায়ন করার উপায়:

  1. Spring Cache ব্যবহারের মাধ্যমে
  2. Ehcache বা Redis ব্যবহারের মাধ্যমে

এখানে দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো।

1. Spring Cache ব্যবহার করে Query Caching

Spring Frameworkে ক্যাশিং বাস্তবায়নের জন্য @Cacheable অ্যানোটেশন ব্যবহার করা যেতে পারে। এটি Spring Cache abstraction API এর মাধ্যমে ক্যাশিং পরিচালনা করে। Spring Cache ব্যবহার করতে হলে, আপনাকে একটি ক্যাশ ম্যানেজার কনফিগার করতে হবে, যেমন Ehcache বা Redis।

Spring Cache এর মাধ্যমে JdbcTemplate কুয়েরি ক্যাশিং:

প্রথমে Spring Cache কনফিগারেশন সেটআপ করতে হবে এবং তারপরে JdbcTemplate এর মাধ্যমে SQL কুয়েরি ক্যাশ করা যাবে।

Pom.xml এ Spring Cache এবং Ehcache ডিপেনডেন্সি যোগ করা:
<dependencies>
    <!-- Spring Cache Dependency -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.3.23</version>
    </dependency>

    <!-- Ehcache Dependency -->
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>3.9.7</version>
    </dependency>
</dependencies>
Spring Cache Configuration:

Spring Cache কনফিগারেশন করতে @EnableCaching অ্যানোটেশন ব্যবহার করা হয়।

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManager() {
        EhCacheManagerFactoryBean cacheManager = new EhCacheManagerFactoryBean();
        cacheManager.setConfigLocation("classpath:ehcache.xml"); // ehcache.xml ফাইলটি কনফিগার করতে হবে
        return cacheManager;
    }

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManager().getObject());
    }
}
@Cacheable ব্যবহার করে JdbcTemplate Query Caching:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final JdbcTemplate jdbcTemplate;

    public UserService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Cacheable(value = "usersCache", key = "#userId")
    public String getUserNameById(int userId) {
        String sql = "SELECT name FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, String.class, userId);
    }
}

এখানে:

  • @Cacheable অ্যানোটেশন ব্যবহার করে getUserNameById মেথডের জন্য ক্যাশিং নির্ধারণ করা হয়েছে।
  • value-এ ক্যাশের নাম (যেমন usersCache) এবং key-এ ক্যাশের কী হিসাবে userId ব্যবহার করা হয়েছে।
  • প্রথমবার কুয়েরি এক্সিকিউট হওয়ার পর, ফলাফল ক্যাশে সংরক্ষিত হবে এবং পরবর্তীতে একই userId এর জন্য কুয়েরি আবার ডেটাবেস থেকে না গিয়ে ক্যাশ থেকে পাওয়া যাবে।
Ehcache কনফিগারেশন (ehcache.xml):
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ehcache.org/ehcache/3.0 http://www.ehcache.org/ehcache/3.0/ehcache.xsd">
    <cache alias="usersCache">
        <heap>1000</heap> <!-- ক্যাশে সর্বোচ্চ 1000 আইটেম সংরক্ষণ করবে -->
        <expiry>
            <ttl>10m</ttl> <!-- ক্যাশে সংরক্ষিত ডেটা 10 মিনিট পর এক্সপায়ার হবে -->
        </expiry>
    </cache>
</ehcache>

2. Ehcache বা Redis ব্যবহার করে Query Caching

Ehcache এবং Redis ক্যাশিং প্রযুক্তির মাধ্যমে আরও উন্নত ক্যাশিং বাস্তবায়ন করা যায়। এগুলো বড় পরিমাণ ডেটা বা ডিস্ট্রিবিউটেড ক্যাশ সিস্টেমের জন্য উপযুক্ত।

Redis ব্যবহার:

Redis ব্যবহার করতে হলে, আপনাকে Spring Data Redis কনফিগারেশন করতে হবে এবং Redis ক্যাশ ম্যানেজার ব্যবহার করতে হবে।

Pom.xml এ Redis ডিপেনডেন্সি যোগ করা:
<dependencies>
    <!-- Spring Data Redis Dependency -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>3.0.0</version>
    </dependency>

    <!-- Lettuce Redis Client Dependency -->
    <dependency>
        <groupId>io.lettuce.core</groupId>
        <artifactId>lettuce-core</artifactId>
        <version>6.1.5</version>
    </dependency>
</dependencies>
Redis Cache Configuration:
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(cacheConfig)
                .build();
    }
}

সংক্ষেপে:

Spring JDBC এর JdbcTemplate-এর মাধ্যমে Query Caching বাস্তবায়ন করতে, Spring Cache ব্যবহার করা যায়, যা বিভিন্ন ক্যাশ ম্যানেজার (যেমন Ehcache বা Redis) এর সাথে সমন্বয়ে কাজ করে। @Cacheable অ্যানোটেশন ব্যবহার করে ক্যাশিং সিস্টেমটি খুব সহজে কার্যকর করা যায়। Query Caching ব্যবহারের মাধ্যমে ডেটাবেসে অতিরিক্ত লোড কমানো যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।

Content added By

উদাহরণ সহ Caching ব্যবহার

108
108

Spring JDBC-তে Caching ডাটাবেসের সাথে সংযুক্তির ফ্রিকোয়েন্সি এবং লোড কমাতে ব্যবহৃত হয়। Caching ডাটাবেস থেকে ফ্রিকোয়েন্টলি অ্যাক্সেস করা ডেটা স্টোর করে রাখে এবং প্রয়োজন অনুযায়ী তা দ্রুত সরবরাহ করে।

Spring JDBC-তে Caching সাধারণত Ehcache, Caffeine, Hazelcast, বা Spring Cache Abstraction ব্যবহার করে ইমপ্লিমেন্ট করা যায়।


Spring Cache Abstraction: সংক্ষিপ্ত বিবরণ

Spring Cache Abstraction একটি ফ্রেমওয়ার্ক-অ্যাগনস্টিক কনফিগারেশন প্রদান করে। এটি ডাটাবেস থেকে প্রাপ্ত ডেটাকে একটি ইন-মেমরি ক্যাশে সংরক্ষণ করে এবং পুনরায় ডেটাবেস কল এড়ায়।

Caching এর জন্য মূল ধাপগুলো:

  1. Caching লাইব্রেরি যুক্ত করা।
  2. Caching ইন্টিগ্রেশন কনফিগার করা।
  3. @Cacheable, @CachePut, এবং @CacheEvict অ্যানোটেশন ব্যবহার করা।

Caching ইমপ্লিমেন্টেশন: উদাহরণ সহ

১. ডিপেন্ডেন্সি যোগ করা

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.x.x</version>
</dependency>

২. Caching কনফিগারেশন

Spring Boot Configuration:

Spring Boot-এ Caching চালু করতে @EnableCaching অ্যানোটেশন ব্যবহার করুন।

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("users"); // Cache name: "users"
    }
}

Ehcache Configuration:

Ehcache ব্যবহার করলে, একটি ehcache.xml ফাইল তৈরি করুন।

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3">
    <cache alias="users">
        <heap unit="entries">100</heap>
        <expiry>
            <ttl unit="seconds">600</ttl> <!-- Cache 10 মিনিটের জন্য বৈধ -->
        </expiry>
    </cache>
</config>

Spring Integration:

@Configuration
@EnableCaching
public class EhCacheConfig {

    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> cm.createCache("users", new MutableConfiguration<>()
                .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ofMinutes(10)))
                .setStoreByValue(false));
    }
}

৩. DAO বা Service লেয়ারে Caching যুক্ত করা

উদাহরণ: @Cacheable ব্যবহার করে ডেটা ফেচিং

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Cacheable(value = "users", key = "#id") // Cache data with key = id
    public User getUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, 
            new BeanPropertyRowMapper<>(User.class));
    }
}

কোড ব্যাখ্যা:

  1. @Cacheable:
    • value: ক্যাশের নাম।
    • key: নির্দিষ্ট রেকর্ডের জন্য কী।
  2. প্রথমবার ডেটাবেস থেকে ডেটা ফেচ করা হবে এবং ক্যাশে সংরক্ষণ করা হবে। পরবর্তীবার কেবল ক্যাশ থেকে ডেটা রিটার্ন করবে।

উদাহরণ: @CacheEvict ব্যবহার করে Cache Clear

@CacheEvict(value = "users", key = "#id") // Clear cache for a specific user
public void deleteUserById(int id) {
    String sql = "DELETE FROM users WHERE id = ?";
    jdbcTemplate.update(sql, id);
}

কোড ব্যাখ্যা:

  • @CacheEvict: ডেটাবেস থেকে ডেটা ডিলিট করার পর ক্যাশ থেকে সংশ্লিষ্ট ডেটাও মুছে ফেলে।

উদাহরণ: @CachePut ব্যবহার করে Cache আপডেট

@CachePut(value = "users", key = "#user.id") // Update cache with the latest data
public User updateUser(User user) {
    String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";
    jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());
    return user;
}

কোড ব্যাখ্যা:

  • @CachePut: ডেটাবেস এবং ক্যাশ উভয়েই নতুন ডেটা আপডেট করে।

৪. Caching এর কার্যকারিতা যাচাই

UserController Example:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable int id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<String> deleteUserById(@PathVariable int id) {
        userService.deleteUserById(id);
        return ResponseEntity.ok("User deleted and cache cleared.");
    }

    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable int id, @RequestBody User user) {
        user.setId(id);
        return ResponseEntity.ok(userService.updateUser(user));
    }
}

Caching এর উপকারিতা

  1. ডেটাবেস লোড কমায়: একই ডেটা বারবার ফেচ করার পরিবর্তে ক্যাশ থেকে দ্রুত সরবরাহ করা হয়।
  2. পারফরম্যান্স উন্নত করে: ইন-মেমরি স্টোরেজের কারণে ডেটা রিড/রাইট দ্রুত হয়।
  3. নেটওয়ার্ক লেটেন্সি হ্রাস করে: ডেটাবেস কলের সংখ্যা হ্রাস করে।

Caching এর সীমাবদ্ধতা

  1. স্টোরেজ লিমিটেশন: ইন-মেমরি ক্যাশে সীমিত ডেটা সংরক্ষণ করা যায়।
  2. ডেটা সিঙ্ক: ক্যাশ এবং ডেটাবেস ডেটার মধ্যে সিঙ্ক রাখতে অতিরিক্ত লজিক প্রয়োজন হতে পারে।
  3. মেমরি ব্যবহারের চাপ: বেশি ডেটা ক্যাশ করলে মেমরি ব্যবহারের চাপ বাড়ে।

উপসংহার

Spring JDBC-তে Caching ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন দ্রুত এবং কার্যকর করা যায়। @Cacheable, @CachePut, এবং @CacheEvict অ্যানোটেশন ব্যবহার করে সহজেই কাস্টমাইজড ক্যাশিং যুক্ত করা যায়। ছোট থেকে মাঝারি প্রজেক্টের জন্য এটি খুবই কার্যকর। বড় প্রজেক্টে কাস্টম Caching সমাধান বা Distributed Cache (যেমন Redis, Hazelcast) ব্যবহারের প্রয়োজন হতে পারে।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion